const bubbleSort = (nums: Array<number>) => {
  // 缓存数组长度
  const len = nums.length;
  //  外层循环用于控制从头到尾的比较+交换到底有多少轮
  for (let index = 0; index < len; index++) {
    // 内层循环用于完成每一轮遍历过程中的重复比较+交换
    for (let j = 0; j < len - 1; j++) {
      // 若相邻元素前面的数比后面的大
      if (nums[j] > nums[j + 1]) {
        // 交换相邻的元素
        [nums[j], nums[j + 1]] = [nums[j + 1], nums[j]];
      }
    }
  }
  return nums;
};

const bubbleSortBetter = (nums: Array<number>) => {
  // 缓存数组长度
  const len = nums.length;
  //  外层循环用于控制从头到尾的比较+交换到底有多少轮
  for (let index = 0; index < len; index++) {
    // 内层循环用于完成每一轮遍历过程中的重复比较+交换
    // 区别是,内层循环规避了后续已经有序的比较
    for (let j = 0; j < len - 1 - index; j++) {
      // 若相邻元素前面的数比后面的大
      if (nums[j] > nums[j + 1]) {
        // 交换相邻的元素
        [nums[j], nums[j + 1]] = [nums[j + 1], nums[j]];
      }
    }
  }
  return nums;
};

const testNums = [5, 4, 3, 2, 1];
console.log(bubbleSort(testNums));
